/// <summary>
/// 外观类（Facade）：计算机启动外观
/// 为客户端提供一个简单统一的接口，隐藏子系统的复杂性
/// 封装了计算机启动的复杂流程，提供一键开机功能
/// </summary>
public class ComputerFacade
{
  // 组合子系统组件
  private CPU _cpu = new();       // CPU子系统
  private Memory _memory = new(); // 内存子系统
  private HardDrive _hardDrive = new(); // 硬盘子系统

  /// <summary>
  /// 启动计算机的简化接口
  /// 封装了复杂的启动流程，客户端只需调用这一个方法
  /// 内部按正确顺序调用子系统组件完成开机
  /// </summary>
  public void StartComputer()
  {
    // 定义常量参数
    const long BOOT_ADDRESS = 0x1234; // 启动扇区地址
    const int SECTOR_SIZE = 1024;     // 扇区大小

    // 按顺序调用子系统组件完成开机流程
    Console.WriteLine("=== 开始计算机启动流程 ===");
    _cpu.Freeze();                          // 1. 冻结CPU
    var data = _hardDrive.Read(BOOT_ADDRESS, SECTOR_SIZE); // 2. 从硬盘读取启动数据
    _memory.Load(BOOT_ADDRESS, data);       // 3. 将数据加载到内存
    _cpu.Jump(BOOT_ADDRESS);                // 4. CPU跳转到启动地址
    _cpu.Execute();                         // 5. CPU开始执行指令
    Console.WriteLine("=== 计算机启动完成 ===");
  }
}